extends 卡牌区数据基类
class_name 手牌区数据类

@export var 卡牌区数据:Array[卡牌堆数据类]

const 最大手牌数:int=6
var 所有者:角色数据类

signal 卡牌堆已清空(卡牌堆数据)
signal 卡牌区数据变化(卡牌堆数据)
signal 添加卡牌失败(卡牌数据)
signal 插入卡牌堆(index)

func _init():
	初始化手牌区()

func 初始化手牌区():
	for i in range(最大手牌数):
		添加空卡牌堆数据()

func 添加空卡牌堆数据():
	var 空卡牌堆:卡牌堆数据类=获取空卡牌堆数据()
	卡牌区数据.append(空卡牌堆)

func 获取空卡牌堆数据():
	var 空卡牌堆:卡牌堆数据类=卡牌堆数据类.new()
	空卡牌堆.卡牌堆数据变化.connect(当卡牌堆数据变化)
	空卡牌堆.所在区=self	
	return 空卡牌堆

func 添加卡牌(卡牌数据:卡牌数据类):
	var 卡牌堆数据=获取卡牌堆数据(卡牌数据)
	if 卡牌堆数据!=null:
		卡牌堆数据.添加卡牌(卡牌数据)
	else:
		卡牌堆数据=可添加卡牌(卡牌数据)
		if 卡牌堆数据!=null:
			卡牌堆数据.添加卡牌(卡牌数据)
		else:
			添加卡牌失败.emit(卡牌数据)

func 当卡牌堆数据变化(卡牌堆数据:卡牌堆数据类):
	卡牌区数据变化.emit(卡牌堆数据)

func 可添加卡牌(卡牌数据:卡牌数据类):
	for 卡牌堆数据 in 卡牌区数据:
		if 卡牌堆数据.可添加卡牌(卡牌数据):
			return 卡牌堆数据

func 获取卡牌堆数据(卡牌数据:卡牌数据类):
	for 卡牌堆数据 in 卡牌区数据:
		if 卡牌堆数据.包含卡牌(卡牌数据):
			return 卡牌堆数据

func 拽起卡牌(卡牌数据:卡牌数据类):
	var 卡牌堆数据=获取卡牌堆数据(卡牌数据)
	if 卡牌堆数据!=null:
		return 卡牌堆数据.拽起卡牌()
		
func 移除卡牌堆数据(卡牌数据:卡牌数据类):
	var 卡牌堆数据:卡牌堆数据类
	var 被拽起卡牌堆数据:卡牌堆数据类=卡牌数据.所在堆
	if 被拽起卡牌堆数据!=null:
		卡牌堆数据=被拽起卡牌堆数据.移除卡牌堆()
		卡牌区数据.erase(被拽起卡牌堆数据)
	return 卡牌堆数据

func 获取卡牌堆index(卡牌堆数据:卡牌堆数据类):
	for index in range(卡牌区数据.size()):
		if 卡牌堆数据==卡牌区数据[index]:
			return index
			
func 为末尾卡牌堆(卡牌堆数据:卡牌堆数据类):
	return 卡牌堆数据==卡牌区数据.back()

#当其内的卡牌堆, 发出"生成卡牌"信号时, 生成卡牌并添加
func 生成卡牌(卡牌数据:Dictionary):
	for 卡牌id in 卡牌数据:
		var 数量=卡牌数据[卡牌id]
		if 数量 is Dictionary:
			数量=randi_range(数量.min,数量.max)
		for i in range(数量):
			var 卡牌=GameFactory.生成数据模型("卡牌",卡牌id)
			if 卡牌!=null:
				添加卡牌(卡牌)
	
#region 操作类函数:当手上卡牌和当前卡牌处于同一个区时, 执行移动手上卡牌所属卡牌堆操作		
func 移动到卡牌堆左侧(手上卡牌:卡牌数据类,当前卡牌堆数据:卡牌堆数据类):
	var 卡牌堆数据s=手上卡牌.所在堆
	var 卡牌堆数据1:卡牌堆数据类=移除卡牌堆数据(手上卡牌)
	var index=获取卡牌堆index(当前卡牌堆数据)
	添加卡牌堆数据(卡牌堆数据1,index)

func 移动到卡牌堆右侧(手上卡牌:卡牌数据类,当前卡牌堆数据:卡牌堆数据类):
	var 卡牌堆数据s=手上卡牌.所在堆
	if not 为末尾卡牌堆(当前卡牌堆数据):
		var 卡牌堆数据1:卡牌堆数据类=移除卡牌堆数据(手上卡牌)
		var index=获取卡牌堆index(当前卡牌堆数据)+1
		添加卡牌堆数据(卡牌堆数据1,index)
	else:
		移动到卡牌堆左侧(手上卡牌,当前卡牌堆数据)
		
func 添加卡牌堆数据(卡牌堆数据:卡牌堆数据类,index:int):
	if not 卡牌区数据.has(卡牌堆数据):
		卡牌区数据.insert(index,卡牌堆数据)
		for 卡牌数据 in 卡牌堆数据.数据:
			卡牌数据.所在堆=卡牌堆数据
		卡牌堆数据.所在区=self
		if not 卡牌堆数据.卡牌堆数据变化.is_connected(当卡牌堆数据变化):
			卡牌堆数据.卡牌堆数据变化.connect(当卡牌堆数据变化)
		插入卡牌堆.emit(index)
#endregion 
		
#region 操作类函数:当手上卡牌和当前卡牌不同一个区时, 执行插入手上卡牌操作
func 插入到卡牌堆左侧(手上卡牌:卡牌数据类,当前卡牌堆数据:卡牌堆数据类):
	var index=获取卡牌堆index(当前卡牌堆数据)
	_添加卡牌到index(手上卡牌,index)

func 插入到卡牌堆右侧(手上卡牌:卡牌数据类,当前卡牌堆数据:卡牌堆数据类):
	if not 为末尾卡牌堆(当前卡牌堆数据):
		var index=获取卡牌堆index(当前卡牌堆数据)+1
		_添加卡牌到index(手上卡牌,index)
	else:
		插入到卡牌堆左侧(手上卡牌,当前卡牌堆数据)
		
func _添加卡牌到index(手上卡牌:卡牌数据类,index:int):
	var 卡牌堆数据:卡牌堆数据类=获取卡牌堆数据(手上卡牌)
	if 卡牌堆数据!=null:
		卡牌堆数据.添加卡牌(手上卡牌)
	else:
		卡牌堆数据=卡牌堆数据类.new()	
		卡牌堆数据.添加卡牌(手上卡牌)
		添加卡牌堆数据(卡牌堆数据,index)		
#endregion
	
#func 获取空卡牌堆index():
	#for i in range(卡牌区数据.size()):
		#if 卡牌区数据[i].is_empty():
			#return  i
	#return -1

#region 操作类函数:当手上卡牌和当前卡牌处于同一个区时, 执行移动手上卡牌所属卡牌堆操作		
func 移动到卡牌堆(手上卡牌:卡牌数据类,当前卡牌堆数据:卡牌堆数据类):
	var 卡牌堆数据s=手上卡牌.所在堆
	var 卡牌堆数据1:卡牌堆数据类=移除卡牌堆数据(手上卡牌)
	var index=获取卡牌堆index(当前卡牌堆数据)
	_设置卡牌堆数据(卡牌堆数据1,index)
	
func _设置卡牌堆数据(卡牌堆数据:卡牌堆数据类,index:int):
	for 卡牌数据 in 卡牌堆数据.数据:
		卡牌区数据[index].添加卡牌(卡牌数据)
	卡牌区数据变化.emit()
	
func 设置到卡牌堆(手上卡牌:卡牌数据类,当前卡牌堆数据:卡牌堆数据类):
	var 卡牌堆数据:卡牌堆数据类=获取卡牌堆数据(手上卡牌)
	if 卡牌堆数据==null:
		卡牌堆数据=当前卡牌堆数据
	卡牌堆数据.添加卡牌(手上卡牌)
#endregion	
